/*
 * Copyright © 2024-2025 Wenze Wei
 *
 * This file is part of StadionOS.
 *
 * This Source Code Form is subject to the terms of the GNU General Public License, v. 2.0.
 * You can obtain a copy of the GPL at
 * https://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
 * the specific language governing rights and limitations under the License.
 */

#ifndef LIBS_ERRORR_H
#define LIBS_ERRORR_H

#include "./print.h"
#include <pthread.h>
#include <stdlib.h>

#define SUCCESS          0
#define EEPERM           1
#define EENOENT          2
#define EESRCH           3
#define EEINTR           4
#define EEIO             5
#define EENXIO           6
#define EE2BIG           7
#define EENOEXEC         8
#define EEBADF           9
#define EECHILD          10
#define EEAGAIN          11
#define EENOMEM          12
#define EEACCES          13
#define EEFAULT          14
#define EENOTBLK         15
#define EEBUSY           16
#define EEEXIST          17
#define EEXDEV           18
#define EENODEV          19
#define EENOTDIR         20
#define EEISDIR          21
#define EEINVAL          22
#define EENFILE          23
#define EEMFILE          24
#define EENOTTY          25
#define EETXTBSY         26
#define EEFBIG           27
#define EENOSPC          28
#define EESPIPE          29
#define EEROFS           30
#define EEMLINK          31
#define EEPIPE           32
#define EEDOM            33
#define EERANGE          34
#define EEDEADLK         35
#define EENAMETOOLONG    36
#define EENOLCK          37
#define EENOSYS          38
#define EENOTEMPTY       39
#define EELOOP           40

#ifndef EEWOULDBLOCK
#define EEWOULDBLOCK     41
#endif

#define EENOMSG          42
#define EEIDRM           43
#define EECHRNG          44
#define EEL2NSYNC        45
#define EEL3HLT          46
#define EEL3RST          47
#define EELNRNG          48
#define EEUNATCH         49
#define EENOCSI          50
#define EEL2HLT          51
#define EEBADE           52
#define EEBADR           53
#define EEXFULL          54
#define EENOANO          55
#define EEBADRQC         56
#define EEBADSLT         57

#ifndef EEDEADLOCK
#define EEDEADLOCK       58
#endif

#define EEBFONT          59
#define EENOSTR          60
#define EENODATA         61
#define EETIME           62
#define EENOSR           63
#define EENONET          64
#define EENOPKG          65
#define EEREMOTE         66
#define EENOLINK         67
#define EEADV            68
#define EESRMNT          69
#define EECOMM           70
#define EEPROTO          71
#define EEMULTIHOP       72
#define EEDOTDOT         73
#define EEBADMSG         74
#define EEOVERFLOW       75
#define EENOTUNIQ        76
#define EEBADFD          77
#define EEREMCHG         78
#define EELIBACC         79
#define EELIBBAD         80
#define EELIBSCN         81
#define EELIBMAX         82
#define EELIBEXEC        83
#define EEILSEQ          84
#define EERESTART        85
#define EESTRPIPE        86
#define EEUSERS          87
#define EENOTSOCK        88
#define EEDESTADDRREQ    89
#define EEMSGSIZE        90
#define EEPROTOTYPE      91
#define EENOPROTOOPT     92
#define EEPROTONOSUPPORT 93
#define EESOCKTNOSUPPORT 94
#define EEOPNOTSUPP      95
#define EEPFNOSUPPORT    96
#define EEAFNOSUPPORT    97
#define EEADDRINUSE      98
#define EEADDRNOTAVAIL   99
#define EENETDOWN        100
#define EENETUNREACH     101
#define EENETRESET       102
#define EECONNABORTED    103
#define EECONNRESET      104
#define EENOBUFS         105
#define EEISCONN         106
#define EENOTCONN        107
#define EESHUTDOWN       108
#define EETOOMANYREFS    109
#define EETIMEDOUT       110
#define EECONNREFUSED    111
#define EEHOSTDOWN       112
#define EEHOSTUNREACH    113
#define EEALREADY        114
#define EEINPROGRESS     115
#define EESTALE          116
#define EEUCLEAN         117
#define EENOTNAM         118
#define EENAVAIL         119
#define EEISNAM          120
#define EEREMOTEIO       121
#define EEDQUOT          122
#define EENOMEDIUM       123
#define EEMEDIUMTYPE     124
#define EECANCELED       125
#define EENOKEY          126
#define EEKEYEXPIRED     127
#define EEKEYREVOKED     128
#define EEKEYREJECTED    129
#define EEOWNERDEAD      130
#define EENOTRECOVERABLE 131
#define EBERROR          132
#define ERETAIN1         133
#define ERETAIN2         134
#define ERETAIN3         135

static _Thread_local int error = 0;

int  Sgetr(void);
void Ssetr(int err);
void Sperror(const char *s);
void Spperror(int err);

#endif //LIBS_ERRORR_H
